Integer and characters prefix based methodologies combined with parallel data sort methodology enhance the execution performance of any string sorting algorithm

ABSTRACT

Methodology to reduce the running time of any string sorting algorithm is described. In one methodology, a prefix of each string from the input unsorted string array is converted to an integer and placed in an array. The array of integers is sorted using the given sorting algorithm. In subsequent methodology, the characters of the string prefix are placed in a record structure and stored in an array of character records. The array of character records is sorted using the given sorting algorithm. The input unsorted array of strings is then sorted using either the sorted array of integers or character records as a reference. Both methodologies showed performance improvements when running in sequential mode only. Therefore, parallel data sort methodology (PDS) was introduced allowing sorting algorithms to sort data in parallel, and its implementation made the two methodologies execute much faster in parallel mode.

FIELD OF TECHNOLOGY

This embodiment describes methods of improving the performance of string based sorting algorithms by using a prefix of each string from the input of unsorted string list and convert it to either an integer or a record of characters before running the sorting algorithm.

BACKGROUND

In today's information age, most data are stored as strings. Sorting these huge data helps in easing the accessing and processing of the information within the data. Moreover, whenever there is a need to reset a computer system from a backup data, sorting might be needed and must be done as fast as possible. Thus, fast sorting is needed to expedite the start of the search process in normal mode and after a system crash. Today, there are about 30 generic sorting algorithms and another 30 extensions to these generic sorting algorithms for a total of more than 60 sorting algorithms. One of them is Quicksort (sometimes called partition-exchange sort) is an efficient sorting algorithm.

Most sorting algorithms work on both data types' integers and strings and only a few algorithms work on strings only. With so much of data being produced and hardware available to support it, there is a need for a faster sorting technique to help ease the searching process.

SUMMARY

The instant methodologies gave great performance while sorting in sequential mode. The introduction and implementation of a parallel data sort (PDS) methodology, provides further improvements in sorting.

In one embodiment, a prefix of each string from the input unsorted string list is converted to an integer and placed in a list. The list of integers is sorted using the given sorting algorithm. The input unsorted list is then sorted using the sorted integer list as a reference. Given an unsorted string array (USTA) and a sorting algorithm (SAlg) to sort USTA, where SAlg represents one of the sixty sorting algorithms.

The first methodology is performed in five stages (FIG. 1): Prefix extraction from strings in unsorted string array (UNSA) and converting the prefix to an unsigned long integer (ulong) and storing the result in an array with records of integers (ARI). Each record in the ARI holds two integers: the ulong (eight byte) and an integer (four bytes). The ulong integer will hold the converted value of the prefix and the integer will hold location of the string in UNSA of the prefix.

Sorting ARI using the SAlg and on the ulong integers in the ARI. After sorting, there may exist some equal values ulongs in the array ARI. Finding the lists of equals in the ARI and placing their starting location and the location of the last equal values in an array with record of integers (EVARI), where each record holds two integers each holding the location values of the starting and the last, respectively.

Transferring the unsorted array to an array called sorted string array (SSTA), using the integer value in the sorted ARI as a reference. Sorting the list of equals, if they exist in the ARI, using SAlg with EVARI that indicates which list needs sorting. The sorting will be done on the string of the SSTA.

First Methodology Design Options: The first stage of this methodology requires the conversion of string prefix to numeric value. A decision need to be made on the conversion method and on the size of the integer type that would hold the converted string prefix. The choice will be made on the best conversion method and the size of integer data type that would lead to the best performance of this stage.

There is several integer data type with different sizes that could hold the converted prefix integer values. A benchmark evaluation will be made to find the best size integer for the first stage of this methodology. There are four integer types: short integer, integer, long integer, and the integer part of a decimal data type. Short integer are two bytes long or 16 bits and generally referred to as Int16. The Int16 could hold a converted string prefix of three characters long. Integers are four bytes long or 32 bits and generally referred to as Int32. The Int32 could hold a converted string prefix of six characters long. Long integers are eight bytes long or 64 bits and generally referred to as Int64. The Int64 could hold up to thirteen characters of a converted string prefix. On the other hand, the integer part of a decimal data type has 96 bits to hold its integer value which allows it to hold up to 20 characters of string prefix.

A benchmark test was made to evaluate the performance of the integer size on the first methodology. FIG. 4A and FIG. 4B show the results of running all integer sizes. Int64 performed best for both sequential and parallel mode for the first methodology. Thus, Int64 or ulong will be adapted for the first methodology. Detailed discussion of these results will be made in this document.

Once the integer data type is chosen, the choice of the best table lookup for the conversion of the characters in the string prefix to numerical value comes. Here, we tested three methods: the linear search method, the hash table search, and the ASCII table lookup method (we called it here the KOT method). Description of each method is discussed in details when presenting the detailed description of this methodology. However, short benchmark results showed that the KOT method was much faster than the other methods (FIGS. 9A and 9B).

After choosing the integer type and the numeric conversion method, the benchmarking test to find the algorithm that would have best performance with this methodology comes. At first, we found that .Net sort, developed by Microsoft, gave a better performance in the sequential mode of the methodology. For that purpose .Net sorting was chosen as the default SAlg when evaluating and benchmarking stages of both methodologies in sequential mode.

The .Net sorting is a hybrid algorithm made up from three sorting algorithms: quicksort, heapsort, and insertion sort. However, there is no parallel version of .Net algorithm. For testing an algorithm that have a parallel version, we have developed a new hybrid adaptive algorithm that uses quicksort, insertion sort, and merge sort and called it QIM algorithm. When executing QIM while using the PDS methodology had great performance results for the parallel mode. When testing for parallel execution of the methodologies, we used QIM as default. When discussing the details of the first methodology we shall expand on the performance of various sort algorithm including QIM.

In summary, the design choices would be to use Int64, KOT method, and .Net sort as the default standard for evaluating and comparing the first methodology. Int64 will be used in the unsigned mode which will be called ulong. The sort algorithm .Net is chosen because it is a standard for the Windows environment. However, for parallel sort QIM, under PDS, is used as the standard.

Choosing the Int64 for numeric process means that the maximum prefix size is thirteen characters for alphabetic string and twelve characters for alphanumeric strings.

The question now is what to do when the string length is shorter than the assigned prefix length? Would the prefix be padded or not (where padding means adding extra characters to the short string to make it the size of the prefix)? Not padding the prefix would result in wrong sorting results, where the prefix with characters “ANT” will have higher numerical value than the prefix “TO”. To solve this problem, a padding character is chosen. A number of the chosen padding characters would be appended to the string to achieve the prefix size.

There are two types of padding, right padding and left padding. By adding an extra character to the left of the string and up to the assigned prefix size, we have a left padding like: (‘’’’’’’’’’ANT and ‘’’’’’’’’’TO), whereas right padding is adding a character to the right of the string like: (ANT’’’’’’’’’’ and TO’’’’’’’’’’). Left padding will make the prefix “TO” smaller than “ANT” while right padding will make “TO’ larger than “ANT”. Based on these results, we used right padding. Therefore, with right padding each prefix will be thirteen characters long regardless of the string size.

Finally, we would like to present our evaluation metrics for both methodologies. Generally, when a system is slightly faster than another system, we give the percentage of performance gain. However, if the new system is more than twice faster than the common method, then we use the term speed factor, which is the number of times the new system is faster. If the new system is twice as fast, then the speed factor is two, three times faster the speed factor is three and so on.

If there is a speed factor evaluation comparison, then comparison will be made with the SAlg as the .Net sorting algorithm running in sequential mode without the methodology. On the other hand, the default data size would be a hundred million alphabetic strings with variable size stings. This ensures that the methodology does not modify the algorithm being used in sequential mode. On the other hand, parallel QIM with PDS will be used as default when both methodologies are running in parallel mode. Sorting Data in Parallel Mode is done. Our performance enhancing methodologies would have great results if it runs in parallel along with a parallel sorting algorithm SAlg.

Most of today's computer systems have multiple processors. In order to fully utilize these multiple processer, the data need to be processed in parallel. Most sorting algorithms were designed and written to run in sequential mode. Having a parallel version of the algorithm may require redesigning and rewriting. Such steps may be hard because some algorithms are inherently sequential in nature. To solve this riddle, we are suggesting a methodology that we call it Parallel Data Sort, or PDS, which allows many sequential sorting algorithm SAlg to run in parallel

The parallel sorting methodology (PDS) has the objective of sorting the data in parallel using any sorting algorithm SAlg, rather than redesign SAlg to sort the data in parallel. The methodology uses the following steps:

-   a. Divide the data to be sorted into blocks. -   b. Sort the data in the blocks in parallel using SAlg. Each     processor or threads sorts a data block. -   c. Group every two sorted blocks and sort them together into one     larger sorted block using SAlg again. -   d. Repeat the previous step until the whole data is sorted.

Here, SAlg is used twice, first to sort unsorted blocks then secondly SAlg is used to sort two fused independently sorted blocks. If the SAlgs in both are different then we have a hybrid algorithm; otherwise, we have SAlg with merging capability. Details of this methodology will be discussed later in this document.

BRIEF DESCRIPTION OF FIGURES

This embodiment is illustrated by way of example with no limitation in the tables and in the accompanying figures, and in which:

FIG. 1 shows a flowchart for the five stages of the first methodology: the integer prefix-based sorting method.

FIG. 2 shows a simple example of the first methodology taking the value of the string (first 3 characters) as a Prefix from the input strings and converting this prefix to an Integer Value for the sorting process shown.

FIGS. 3A, 3B, 3C and 3D show the different stages of the flowchart of the first methodology.

FIGS. 4A and 4B show the graphical comparison of the speed factor for running the first methodology in sequential and parallel modes with different integer sizes (Int16, Int32, Int64, and the integer part of the Decimal) that would hold the converted numerical value of the string prefix. On the other hand, FIGS. 4C and 4D show the tables of the running time in seconds of the methodology for different size integers that hold the numerical value of the prefix.

FIG. 5 shows the tables used for the linear search method of prefix computation conversion to numerical values.

FIG. 6 shows the hash tables used for the hash search method of prefix conversion to numerical values.

FIGS. 7A, 7B, and 7C show sample ASCII tables for lookup (KOT method) for prefix conversion to numerical value for stage one of the first methodology.

FIGS. 8A and 8B show how the thirteen-character prefix “ACKNOWLEDGMEN” for the word “ACKNOWLEDGMENTS” and how the extracted characters get their value from the lookup search tables. Then, the numerical value for the prefix is computed.

FIGS. 9A and 9B show the graphical comparisons for the speed factor gained for the sequential and parallel execution of the first methodology for alphabetic strings, using the three-table lookup methods: KOT, linear, and hash table search methods. The .Net Sort is SAlg used here, and one hundred million, variable size string, data elements. On the other hand, FIGS. 9C and 9D show the tables with the running time in seconds along with the speed factor gained for the sequential and parallel execution of the first methodology for alphabetic strings using the three-table lookup methods and SAlg is .Net Sort (QS).

FIGS. 10A and 10B show the speed factor gained for the sequential execution of the first methodology for alphabetic and alphanumeric character strings, where SAlg is: .Net, Merge, Quick and Heap Sort. On the other hand, FIGS. 10C and 10D show the tables with the running time in seconds of each algorithm, then the computation of the speed factor gained for the sequential execution of the first methodology for alphabetic and alphanumeric character strings, where SAlg is .Net, Merge, Quick and Heap Sort; all compared to their sequential running time alone, respectively, for the speed factor evaluation, which clearly shows the effect of the first methodology.

FIGS. 11A and 11B show the speed factor gained for the parallel execution of the first methodology for alphabetic and alphanumeric character strings, where SAlg is .Net, Merge, Quick and Heap Sort. On the other hand, FIGS. 11C and 11D show the tables with the running time in seconds of each algorithm, then the computation of the speed factor gained for the parallel execution of the first methodology for alphabetic and alphanumeric character strings, where SAlg is .Net, Merge, Quick, Heap, and QIM Sort; all compared to sequential running time alone, respectively, for the speed factor evaluation. Here, the PDS methodology is used with QIM and Merge algorithm.

FIGS. 12A and 12B show the speed factor gained for the sequential and parallel execution of the first methodology for alphabetic character strings for iterative algorithms, where SAlg is Bubble, Selection, and Insertion Sort. On the other hand, FIGS. 12C and 12D show the tables with the values of the running time in seconds of the iterative algorithms using the first methodology, then the speed factor gained for the sequential and parallel execution of the first methodology is computed. Here, SAlg is either Bubble, Selection, or Insertion Sort and the comparison for the speed factor is done in comparison with the same algorithm running in the sequential mode without the first methodology. Here, the PDS methodology is used in Bubble, Selection, and Insertion algorithms.

FIG. 13 shows a flowchart for the five stages of the second methodology, the characters prefix-based sorting method.

FIG. 14 shows a sorting example of the second methodology using a record structure of 3 characters and an integer.

FIGS. 15A, 15B, 15C, and 15D show the detailed flowcharts for the five stages of the second methodology.

FIGS. 16A and 16B show the speed factor for the second methodology in sequential and parallel execution with character records having three to 30 characters to sort 100 million strings. The SAlg being .Net sort for the sequential execution, and QIM under PDS for the parallel execution. On the other hand, FIGS. 16C and 16D show the tables with the running time in seconds of .Net algorithm for three or more characters records. Note that the speed factor is a comparison of the running time for .Net sort in sequential mode, which took 363 seconds to sort 100,000,000 elements, to the running time of the same .Net algorithm running using the second methodology.

FIGS. 17A, 17B, 17C and 17D show the speed factor for sorting arrays with fixed size strings. For example, the fixed size alphanumeric string of six character used by airlines to represent passenger name record (PNR). PNR is used for flight booking, reservation, and checking in. The graph representing the speed factor for the execution of both the first and the second methodologies. The first methodology uses Int32, KOT, and .Net sort in sequential run and QIM under PDS in parallel run. The second methodology uses character records with six characters while .Net sort in sequential run and QIM under PDS in parallel run as shown in FIGS. 17C and 17D.

FIGS. 18A and 18B show the speed factor gained for the sequential and parallel execution of the second methodology for alphabetic character strings, where SAlg is .Net, Merge, Quick and Heap Sort. On the other hand, FIGS. 18C and 18D show the tables with the running time in seconds of each algorithm under different load of elements to be sorted. The speed factor is computed in comparison to the corresponding SAlg running without the methodology. Here, the PDS methodology is used with QIM and Merge algorithms.

FIGS. 19A and 19B show the speed factor gained for the sequential and parallel execution of the second methodology for alphabetic character strings, using iterative algorithms. Where SAlg is Bubble, Selection and Insertion Sort. On the other hand, FIGS. 19C and 19D show the tables with the running time in seconds of each iterative algorithm under different load of elements to be sorted. The speed factor is computed in comparison to the corresponding SAlg running without the methodology. Here, the PDS methodology is used with Bubble, Selection, and Insertion algorithms.

FIGS. 20A and 20B show graphical comparisons of the sequential and parallel running time of the five stages for both the first and the second methodologies. FIG. 20C show the tables of the actual running times in seconds for the sequential and parallel executions, as well as the speed factor gains.

FIG. 21 shows the flowchart of the PDS, the methodology that allows many sequential sorting algorithms to run in parallel.

FIG. 22 shows the flowchart for Bubble sort execution in the second stage of PDS.

FIG. 23 shows an example for Bubble sort execution in the second stage of PDS.

FIG. 24 shows the flowchart for Selection sort execution in the second stage of PDS.

FIG. 25 shows an example for Selection sort execution in the second stage of PDS.

FIG. 26 shows the flowchart for Insertion sort execution in the second stage of PDS.

FIG. 27 shows an example for Insertion sort execution in the second stage of PDS.

FIG. 28 shows the flowchart for Merge sort execution in the second stage of PDS.

FIG. 29 shows an example for Merge sort execution in the second stage of PDS.

FIG. 30 shows block merge, where merging is done block-wise where a block of elements is moved to array M rather than one string element at a time moved to array M.

FIG. 31 shows a step by step example of the use of block merge sort algorithm in merging two sorted arrays into a one sorted array.

FIGS. 32A and 32B show the speed factor gained between parallel and sequential execution for QIM and merge sort under PDS using a processor with six-core processors and 12 threads. The speed gain for QIM was more than 3 times faster, while merge sort was more than two times faster than the sequential run, respectively.

FIGS. 33A, 33B, and 33C show the graph for the speed factor gain using PDS with merge for iterative algorithms O (N²): insertion, bubble, and selection sorts.

FIG. 33D shows the table for sequential execution time and PDS time in seconds for sorting using bubble, selection, and insertion.

FIG. 34A shows the speed factor gained when using the PDS methodology with block merge on insertion and bubble sorts.

FIG. 34B shows the speed factor gained of the parallel first methodology using the PDS methodology with block merge on bubble and insertion sorts.

FIG. 34C shows the execution time for sequential bubble and insertion sorts along with parallel bubble and insertion sorts using PDS with block merge methodology.

FIG. 34D shows the execution time for sequential bubble and insertion sorts along with parallel bubble and insertion sorts using the first methodology and PDS with block merge.

DETAILED DESCRIPTION

For this embodiment and in the following discussion, a detailed description will be given that explain the five stages of the first methodology. Detailed explanation on the decisions of the choice of Int64 and KOT as default while the default SAlg is .Net for sequential execution and QIM for parallel execution.

Integers are mutable data types that are stored by value, have fixed size and have strong hardware support. Similarly, character data type are stored by value, have fixed size and hardware support. On the other hand, strings are immutable data types that are stored by reference and may be declared with variable or fixed size. Storing by value means that the data are stored at the memory location indicated by the address of the variable. However, storing by reference means that at the address of the variable there be a pointer (another address) to a memory location, called memory heap, where the value of the variable resides. The central processing unit, CPU, of the computer accesses data from the cache memory, a fast access memory. Data need to be moved from main memory to the cache, this is accomplished by a cache line a 64-byte memory bus. If the data requested by the CPU is in the cache, then we have a cache hit and if not, then we have a cache miss. If data is requested from an array in a sequential order, then the data are likely to be in the cache. This is called spatial locality. Thus, spatial locality increases the cache hits. When loading the cache line with integers from an array, the cache line will hold multiple integers that are stored by value. Having a sequence of integers from one array in the cache will exhibit spatial locality and thus, more cache hits. The same properties hold for character data type or record of characters. On the other hand, an array of strings will hold pointers. When this array is accessed, the cache line will have pointers. When accessing the strings, the CPU has to use the address in the pointer to access the string. This will likely cause a cache miss. These facts make sorting integers or a record of characters to be much faster than sorting strings. To this end, two methodologies were designed to take advantage of the integer properties or record of characters when sorting strings.

The five stages of the first methodology: Assumption is given an UNSA and a sorting algorithm (SAlg) to sort UNSA: Prefix extraction from strings in UNSA and converting the prefix to an unsigned long integer (ulong) and storing the result in an array with record of integers (ARI). Each record in the array holds two integers: the ulong (eight byte) and an integer (four bytes). The ulong integer will hold the converted value of the prefix and the integer will hold location of the string in UNSA of the prefix.

Sorting ARI using the SAlg and on the ulong integers in the ARI. Finding lists of equals in ARI and placing their starting location and the location of the last equal values in an array with record of integers (EVARI), where each record holds two integers each holding a location value, an index of ARI. Then, continue looking in the ARI array for other lists of equals and record their location first and last.

Transferring the unsorted array UNSA to an array called sorted string array (SSTA), using the integer value in the sorted ARI as a reference as in FIG. 2.

Sorting the list of equals, if they exist in the ARI, using SAlg with EVARI that indicates which list needs sorting. The sorting will be done on parts of the SSTA, the lists with equal prefixes, done in the fourth stage. Since the list of strings to be sorted have equal prefixes, the comparison starts at the fourteenth character (or after the prefixes).

Details of all the stages of the first methodology are explained in the flowchart in FIGS. 3A, 3B, 3C, and 3D. Detailed discussions are in the following paragraphs.

Stage one: converting the prefix to unsigned long integer: First, the properties of integers are explained, then the conversion process is discussed. Integer data types come in three sizes: short-integer, integer, and long-integer with sizes of two bytes, four bytes, and eight bytes, respectively while decimal data type has an integer part of twelve bytes or 96 bits. Integers are of base ten. The long integers (eight bytes with 64 bits) may hold an unsigned integer (called ulong) that can hold a number up to 18 digits base ten (ten possible digits 0-9). Alphabets are of base 27 (26 alphabetic characters and one padding character). Alphabets may represent an integer's value. And an integer may also represent an alphabetical value. Unsigned integer (base ten) may represent up to 13 characters of alphabetical value (base 27) 27¹³ and up to 12 alphanumeric characters (base 37) or 37¹² all represented by integers whose values are in the range of: 27¹³<10¹⁸<2⁶⁴. On the other hand, the integer part of a decimal type may represent 20 characters of alphabetical value and up to 18 alphanumeric characters. All represented by integers whose values are in the range: 27²⁰<10²⁸<2⁹⁶.

Methods of converting the string prefix to numerical value: Converting a prefix string of 13 characters to numerical value has been accomplished using three-table conversion methods. The three methods works on table lookup. Linear search, hash table search, and KOT lookup search. Linear search prefix conversion: The simplest to understand is linear search method. Here, an array of records is created where each record holds a character and an integer. The character and its value. The set of characters that constitute the strings to be sorted are placed in this record array. Each character is given a unique value, while a value one assigned to the padding character. Both the character and its value are placed in the array of records. For prefix conversion, we shall create 13-record arrays with the same characters, but their values are different from one array and the other. In the thirteenth array, the values will be from 1 to 27. In the twelfth array, the values would be 27, 54, 81, or 27¹ multiplied by the values in the thirteenth array and so on. The first array will have 27¹² multiplied by the values in the thirteenth array. Starting with the left most character in the 13-character prefix and search for it in the first array and placing its value in an accumulator. Then, search for the second character in the second array and adding its value to the accumulator. This process continues on the third and fourth up to the thirteenth character and in every step adds the values to the accumulator. The resulting sum in the accumulator would be the numerical equivalence of the prefix of the string (FIG. 5 and FIGS. 8A and 8B).

Hash table prefix conversion: Here, again 13 hash tables are created holding the same values as those in the linear search. In FIG. 6, a simple hash function is presented to simplify the hashing process. The characters in the prefix are processed one character at a time starting with the leftmost. The chosen character is hashed, where its binary value becomes an input to a hash function and the resulting integer is used as an index to the designated hash table. This is similar to linear search and uses an accumulator to add all the results from the 13 hash tables and get the required numerical value of the prefix (FIG. 6 and FIGS. 8A and 8C).

Using KOT method for prefix conversion: In this method we use an idea first introduced in patent claim (U.S. Pat. No. 9,009,200). In the hash table method, the binary value of each character is used by the hash function to get the table index, where the value of the character is stored. In other words, there is a need to compute the address of the character (hash function). In the KOT method, the actual binary value of the character is itself the index, where the value of the character is stored. To accomplish this property, a table with the size of the ASCII table is built and only the location of each character in the ASCII table is filled with the designated value of the character while the other cells in the table are set to zero (FIGS. 7A, 7B, and 7C). Thirteen of these ASCII table sizes are built. Each table holds the character value multiplied by 27^(i), where i ranges from 0 to 12. The direct access for the characters values, no hash function computation, makes this method very fast. This is similar to linear search and uses an accumulator to add all the results from the 13 ASCII tables and get the required numerical value of the prefix (FIGS. 8A and 8B).

Testing the three-prefix conversion methods: Testing these prefix conversion methods on 100 million prefixes and the result is shown in FIGS. 9A and 9B. These figures exhibits the comparison of the running time in seconds of the three-table lookup methods in sequential and parallel modes. The figures show the KOT lookup method was superior. The parallel mode was with six processors only. With more processors, the parallel mode will likely have shorter time.

The sorting process: Once the array ARI is filled then the sorting starts using the code of algorithm SAlg. As mentioned earlier, the algorithm SAlg is used twice, once for sorting the ulong integers in the ARI and again on the strings with equal ulongs integers. The code of algorithm SAlg is not modified in this methodology. In the second sort, SAlg will sort the strings that have equal ulongs and are specified by the values in the record of integers of the EVARI. String comparison will start at the thirteenth character; thus saving comparison time. Since there are multiple lists of prefix strings that have equal ulongs, the process of sorting these lists could be done in parallel for faster process.

Experimental results on the first methodology: A prefix of 13 alphabetic characters are taken from the strings to be sorted and converted to a numerical value and assigned to an unsigned long integer variable (ulong). An array of records with two integers is created that would be parallel to the array of strings to be sorted. In the record, one ulong integer would hold the value of the converted prefix integer (CPI), while the second unsigned integer (4 bytes) would hold the location of the string in the array of strings to be sorted (UNSA). This array of records is sorted based on the ulong for the converted prefix integer CPI. After sorting, some CPI may have equal values. A note is taken for all CPI of equal values and their location, where they start and where they end; first and last location are stored in a new record array called equal values array integer record (EVARI). Once sorting is complete, a new array, sorted string array (SSTA), is created and copy of the strings of the original array (UNSA) are moved to new array (SSTA) using the second integer in the array of records ARI as a reference. An example is demonstrated in FIG. 2.

Sorting strings having equal value prefixes: The newly sorted array SSTA may not be completely sorted because some strings may have prefixes of equal values. Now the EVARI is accessed and the sorting algorithm SAlg is applied to sort every group of strings with equal value prefixes. Each record in the EVARI array holds two integers, one pointing at the beginning and the second integer pointing at the end of the list of strings that have equal value prefixes and require sorting. The sorting will be accomplished by SAlg. Note that the sorting will be comparing the strings not from the start of each string but rather from the location in the string after the prefix, at the fourteenth character, which will result in faster comparison. Thus, SAlg will be used twice, once on the integer array for sorting the CPI and later on strings of SSTA array and using the EVARI as a reference guide. The first SAlg was used for integer sorting and in the later SAlg was used for string sorting. The number of strings sorted in later stage is much smaller in size than the original unsorted array UNSA, and done in parallel, resulting in much faster sorting time. This is true for Int64, but did not apply for Int16 and Int32, where the list of equals was very large (FIGS. 4C and 4D).

Running the first methodology in parallel: The first methodology could run in parallel, where stages one, three, four and five could run in parallel. Stage two could run in parallel by running SAlg algorithm run in parallel internally, which is not part of the methodology. The methodology uses the SAlg without coding it. FIG. 20 A, 20B, 20C shows the result of running the methodology in parallel while the SAlg running sequentially (.Net sort). However, if the user using the methodology and could write a parallel code for SAlg, then the result is called fully parallel as in FIG. 20B. On the other hand, we introduced a new methodology called Parallel Data Sort, PDS, for sorting data in parallel. PDS was implemented in QIM code, parallel merge, bubble, selection, and insertion sorts where they gave superior results in performing parallel execution for the second stage of the parallel first methodology.

Conclusion and results of the first methodology: This embodiment does not present an algorithm but rather a methodology that improves the performance of almost any string sorting algorithms. This methodology was tested on quick, heap, and merge sorts (algorithms with complexity O (N log N)). The results for sequential execution showed an average speedup factor gain of eleven, eight, and four, respectively, on variable length strings of alphabets only. For parallel execution and using the parallel methodology, the speed factor increased to over forty for QIM. Furthermore, after testing this methodology on slow, iterative algorithms with complexity O (N²): bubble sort, selection sort, and insertion sort, the results showed an average speedup factor of 25, 45, and 70, respectively, on variable length strings of alphabets only. For parallel execution and using the parallel methodology PDS the speed factor increased to over four hundred for parallel Insertion and merge insertion. However, the speed factor using QIM, in parallel mode, on fixed size alphanumeric strings, of six characters, was about 60 (FIG. 10).

Summary of the Second Methodology: The details of the second methodology will be discussed in details in the following paragraphs.

The second methodology has also five stages like the first methodology. The five stages are very similar in functionality of the first methodology except for stage one. Moreover, the second methodology uses different data structure than that of the first methodology.

Given an UNSA and a sorting algorithm (SAlg) to sort UNSA, the five stages of the second methodology are:

Prefix extraction from strings in UNSA and converting the prefix to a list of characters making up the prefix and storing the result in an array of character records ACHR. Where each record holds the characters making up the prefix and an integer to store the location of the string in UNSA.

Sorting the ACHR array using the SAlg. Finding lists of character records having the same characters or equals in ACHR and placing their starting location and the location of the last equal in an array of integer record is called EVARI, equal value array with record integers. Each record in EVARI holds two integers, each holds a location value one for the appearance of the records with the same characters or equals and the other of last appearance of the equals in the list found. Then, continuing to look in the array for other lists of equals and record their location first and last. Transferring the unsorted array to an array, sorted string array (SSTA), using the location integer in the sorted ACHR as a reference. Sorting the list of equals if they exist in the ACHR using SAlg with EVARI that indicates which lists with the same characters in the extracted prefix that need sorting. The sorting will be done on the SSTA using SAlg by running real string sorting. Since these lists are short and the number of lists is also small, this makes the operation fast for this stage when done in parallel (FIGS. 16A, 16B, 16C, 16D).

Details of the second methodology: In the following paragraphs, the second methodology will be presented in more details with its advantages over the first methodology and its drawbacks.

Stage one: Converting the prefix to record of characters: First, the properties of character data type are explained, then the conversion process is discussed. Character data type come in two sizes: ASCII or UNICODE, with sizes of one bytes or two bytes, respectively. ASCII represents English language characters while Unicode represents all languages, including the English language. Most of today's computers use Unicode. The cache line of 64 bytes may hold a character record with a maximum of thirty Unicode characters plus an integer that holds the location of the string from which the prefix was taken. On the other hand, the cache line may also hold six records, each has four elements: three Unicode characters, six bytes, and the integers (four bytes) that hold the location of the string from which the prefix was taken; a total of ten bytes. The string prefix is built getting a copy of characters from the string and assigning them to their proper location in the record of characters. Then, the index of the string in UNSA is assigned to the integer part in the record of character. The process continues until all copies of prefixes are assigned to the ACHR.

Testing the effect of the number of characters in a record or the string prefix size: FIGS. 16A, 16B, 16C, and 16D show the speed factor for quicksort sorting hundred million elements in sequential and parallel modes using the second methodology and for three to thirty in character record. As seen in the figure, the speed factor was low for small number of characters, then increases as the number of characters increase, but then almost stabilizes from twelve to thirty characters per record.

Stage two: The sorting process. Once the array ACHR is filled, the sorting starts using the code of algorithm SAlg sorting character records rather than strings. Since characters and record of characters are stored by value, the sorting process was very fast compared to sorting strings, which are stored by reference (FIGS. 16C and 16D).

Stage three: Finding lists of equals. The sorted ACHR is scanned to look for character records with the same characters. An array of integer records is created for these character records with same characters, which we call it equal values array of character record (EVACHR). Each record structure in EVACHR has two integers, the first holds the location of the first character record and the second holds the last character record with the same characters. This is followed by continuing to scan the whole ACHR and recording the locations, all record of characters with same characters, in EVACHR (FIG. 14).

Stage four: Sorting strings having equal value prefixes. The newly sorted array SSTA may not be completely sorted because some strings may have prefixes of equal values. Now the EVACHR is accessed and the sorting algorithm SAlg is applied to sort every group of equal values. Each record in the EVACHR array holds the beginning and end of the strings that require sorting and the sorting will be accomplished by SAlg on the stings in SSTA. As mentioned earlier, the algorithm SAlg is used twice, once for sorting the character record in the ACHR and again on the strings with equal prefixes with character records having the same characters. In the second sort, SAlg will sort the strings that have prefixes with same characters or character records with the same characters. The sorting here will be in the string starting at the character after the prefix, and not at the beginning of the string; hence, reducing the number of characters for comparison. Since there are multiple lists of prefix strings that have equal character records, the process of sorting these lists could be done in parallel for faster processing (FIG. 14).

Experimental results on the second methodology: In the first methodology an ulong integer could hold 13 characters of alphabetic prefix or 12 characters of alphanumeric prefix. In the second methodology, the character record could hold from one to thirty characters of alphabetical or alphanumeric characters. For comparison purposes with the first methodology, the record was made to hold 13 characters. FIGS. 18A and 18B show the graphical results of the speed factor gained for the sequential and parallel execution of the second methodology for alphabetic character strings and a prefix of thirteen characters using algorithms: .Net, quick, merge, and heap sort. .Net sort had the best speed gain from the second methodology. On the other hand, FIGS. 19A and 19B show the graphical results of the speed factor gained for the sequential and parallel execution of the second methodology for alphabetic character strings and a prefix of thirteen characters using algorithms: bubble, selection, and insertion sorts. Selection and insertion sort showed better performance than bubble sort in the second methodology.

Running the second methodology in parallel: Parts of the second methodology could run in parallel where stages one, three, four, and five could run in parallel. Stage two, the executing of the algorithm, will run in sequential mode. Making stage two run in parallel requires changes within the algorithm, which are not part of the methodology.

Having a parallel version of the algorithm may require redesigning and rewriting, such steps may be hard because some algorithms are inherently sequential in nature. To solve this riddle, we have suggested the methodology we call PDS, Parallel Data Sort, which allows many sequential sorting algorithm SAlg to run in parallel (FIG. 21).

The basic embodiment of PDS is to divide the data into blocks then allow multiple copies of SAlg to sort the data blocks in parallel. Once the blocks are sorted, every two sorted blocks are grouped together and the SAlg is used again to resort the joined blocks. The way SAlg is used in the second stage is considered a part of PDS methodology.

Merging two sorted array into one sorted array is generally done by merge sort algorithm. However, in this document we shall show and discuss how SAlg could be used for merging two sorted arrays in addition to merge sort. For example if SAlg was bubble sort or insertion sort, then can we merge two sorted blocks using bubble or insertion sort.

Merging two sorted blocks using bubble sort is done as follows:

-   -   a. Name the two sorted blocks A and B     -   b. Compare the last element of block A with the first element of         block B, then if the last element of block A is smaller than the         first element of block B then merge block A with block B into         one large block M with block A first followed by block B and         exist.     -   c. Otherwise, swap the last element in A with the first element         in B then bubble upward the newly swapped element at end of A,         and bubble downward the newly swapped element at beginning of B.         Run the two processes in parallel. Stop when there is no         swapping and go to the previous step.

The Bubble merge as part of PDS resulted in a speed factor of three for processors with six cores. Merging two sorted blocks using insertion sort is done as follows: Name the two sorted blocks A and B and combine them into array M with indexes pointing to beginning of A and B. The index of A call it start insertion index (ASII) and of B call it start index (BSI).

Compare the first element of B with the last element of A. If larger then stop and M is sorted and merging is complete and exist. Otherwise continue. Remove the first element in block B insert it in block A starting at the ASII. Once insertion location found update ASII shift to overwrite BSI location and to place the element from B. Update BSI and repeat the previous step (FIG. 27).

The previous examples present the way of using of any SAlg for both stages of PDS. In both merging the last element of A is getting smaller and the first element in B is getting larger. This process continues until the first element in B becomes larger than the last element in A. Examples and flowcharts for the second stage of PDS along with the specific SAlg used are presented in this document. FIGS. 20A, 20B, 20C show the results of running the five stages of both methodologies in parallel and in sequential modes. Using PDS methodology to run the parallel mode resulted in high value speed factor.

Conclusion and results of the second methodology: This embodiment does not present an algorithm but rather a methodology that improves the performance of almost any string sorting algorithms. This methodology was tested on quick, heap, and merge sorts (algorithms with complexity O (N log N)). The results showed an average speedup factor of eleven, eight, and four, respectively, on variable length strings of alphabets only. On the other hand, after testing this methodology on slow, iterative algorithms with complexity O (N²): bubble sort, selection sort, and insertion sort, the results showed an average speedup factor of 25, 45, and 70, respectively, on variable length strings of alphabets only. However, the speedup using QIM on alphanumeric strings was 10 and 16 for fixed-size strings, respectively (FIGS. 18A and 18B).

In the following paragraphs, the figures accompanying this document are explained in three divided parts. The first twelve figures are about the first methodology. The following eight figures are for the second methodology. FIG. 20A, 20B, 20C compares the two methodologies. The remaining figures explain the PDS and its implementation.

In FIG. 1, the flowchart of the first methodology is summarized in seven steps.

-   -   a. Step 101: The unsorted array is inputted to the first         methodology for processing.     -   b. Step 102: Here, the first stage of the first methodology is         done. A prefix is extracted from each string of the input         unsorted array. Each string prefix is converted to an integer         value and placed in an array of integer records. The conversion         process has been fully discussed in this document.     -   c. Step 103: This represents the second stage where the given         algorithm to be utilized for the methodology is used to sort the         array of integer record by sorting the integer values of the         converted prefix.     -   d. Step 104: Here is the third stage, where the sorting         algorithm ends and some elements in the array may have equal         integer values. A program would scan the array of integer         records and register the first element and last element in every         group of equal integer values in the array. These location         values are saved in another array of integer record. Details of         these operations are discussed in this document.     -   e. Step 105: This is the fourth stage, where the unsorted array         is copied to another array by the sorted array of integer         records as a reference. The result is a sorted array with some         strings having equal prefix values.     -   f. Step 106: The array of integer records created in step 104         (stage 3) is used as a reference to sort the string elements         with equal value prefixes in the new sorted array. Details of         this operations are discussed in this document.     -   g. Step 107: The sorted array is ready for output.

In FIG. 2, a simple example of the first methodology is presented where a prefix of three characters are converted to integer value. The figure shows five tables, each table represents one of the five stages of the methodology. A three-character prefix was chosen to simplify the operations. The characters chosen for prefix have been underlined:

As shown in FIG. 2 in table of stage 1, extract the string prefix (three characters) from the input string array and convert the prefix to a numerical value then assign it to unsigned integer (Ulong 8 bytes), then record it to an element in the array with record of integers (ARI). The stage 2 shows the sorted array (ARI) using a sort algorithm (SAlg) based on that numerical value (ulong). The objective here is to sort numerical elements rather than sorting string elements. Stage 3 shows after copying elements in the UNSA to the SSTA based on the sorted results of the ARI. Stage 4 is shows where the list equal elements in SSTA are stored. Stage five shows SSTA fully sorted as of stage five and after sorting the list of equals.

FIGS. 3A, 3B, 3C and 3D: In these figures the flowchart of the first methodology is presented. The graph is made up of four sub-flowcharts each showing a stage or two of the first methodology. Each step in the sub-flowchart is numbered and each numbered step is explained in the following text. Summary of steps from 301 to 331: We want to sort the input string array. The process of sorting is divided into four parts:

FIG. 3A: steps from 301 to 308, FIG. 3B: steps from 309 to 319, FIG. 3C: steps from 320 to 326 and FIG. 3D: steps from 327 to 331.

Summary of FIG. 3A steps from 301 to 308: extract the string prefix (10 to 13 characters) from the input string array and convert the prefix to a numerical value then assign it to unsigned integer (ulong 8 bytes) then record it to an element in the array with records of integers (ARI). After that, sort the ARI using a sort algorithm (SAlg) based on that numerical value (Ulong). The objective here is to sort numerical elements rather than sorting string elements. Strings whose sizes are less than the assigned prefix size are right padded to the prefix size.

-   -   a. Step 301: Load the data to be sorted into string array,         called here unsorted string array (UNSA).     -   b. Step 302: Create an array with records of integers (ARI)         parallel to the UNSA array and equal in size. Each record in ARI         has two integers whose values are 8 bytes unsigned integer         (ulong) and 4 bytes integer (Int). The Ulong holds the numerical         value of the converted string prefix, using KOT Method, for each         string in the UNSA array. The Int32 holds the corresponding         index of the string in the UNSA array.     -   c. Step 303: Create an integer variable with the name         LoopCounter and assign Zero as its initial value.     -   d. Step 304: Start loop to convert each prefix to numeric         values: Check if LoopCounter less than or equals to the length         of the ARI array. If the checking result is true, proceed to         Step 305. If not true, go to Step 308.     -   e. Step 305: At index equals to LoopCounter, take a prefix from         the string in the UNSA array and convert it to numerical value         using KOT Method (explained in FIG. 2, FIG. 7C, FIG. 8A, and         FIG. 8B).     -   f. Step 306: Assign the value found in Step 305 to the Ulong of         the ARI array at index of LoopCounter and assign the value of         the LoopCounter to the Int in the ARI record array.     -   g. Step 307: Increment the value of the LoopCounter by one, then         go to Step 304 (continue the loop).     -   h. Step 308: Start the sorting process using SAlg on the ARI         array based on the value of the ulong that each record holds.     -   i. Summary of FIG. 3B steps from 309 to 319: The sorted ARI         array from 301 to 308 may include a number of equal values         Ulong. We try to find the groups of elements of equal value and         place their location (beginning and end) in a spared record         array (EVARI).     -   j. Step 309: After sorting ARI array, there might be lists of         equal numbers of Ulong values in the sorted ARI. For this case,         another record array, called equal values array (EVARI), with         two integers to hold the index of start and end of each list of         equal Ulong values in the ARI after sorting.     -   k. Step 310: Reassign the LoopCounter the value one.     -   l. Step 311: Start outer loop to look for equals elements in the         ARI array: Check if LoopCounter less than or equals to the         length of ARI. If the result is true, proceed to Step 312. If         false, go to Step 320.     -   m. Step 312: Here, we look for lists of equal value Ulongs. To         check if two consecutive ulong values in the record in the ARI         are equal as follows: check if the ulong in the record in the         ARI at index [LoopCounter-1] equals the ulong in the record in         the ARI at index [LoopCounter]. If the result is true, go to         step 314. If false, go to step 313.     -   n. Step 313: Increment the value of the LoopCounter by one.     -   o. Step 314: Create an integer variable with the name         InnerLoopCounter and assign the value of LoopCounter+1 to it.     -   p. Step 315: Start inner loop find and record the start and end         of the equal elements: Check if InnerLoopCounter is less than         the ARI array length. If the result is true, go to step 316. If         false, go to step 311.     -   q. Step 316: Check ARI Array if the ulong in the record at index         [LoopCounter] equals the ulong in the record at index         [InnerLoopCounter]. If the result is true, go to step to 317. If         false, go to step 318.     -   r. Step 317: Increment the value of the InnerLoopCounter by one,         then step to 315 (continue the inner loop).     -   s. Step 318: After finding the equal elements in ARI, the index         of the start and end of these equal elements are recorded in         current record of equal values array (EVARI). In this case, the         start would be LoopCounter−1 as the start and InnerLoopValue as         the end.     -   t. Step 319: Update LoopCounter value to equal InnerLoopCounter         value, then step to 311 (continue the outer loop).     -   u. Summary of FIG. 3C steps from 320 to 326: we copy the strings         from the input array UNSA and create an array (SSTA) and copy         all the string from the UNSA to SSTA according to the ulongs in         the ARI array. Here, we will have a semi-sorted array with         groups of strings whose prefix values are sorted, but the string         themselves are not sorted. The locations of these unsorted         strings are noted in the EVARI array.     -   v. Step 320: Create a new string array, we call it here sorted         string array (SSTA), with size equals to the UNSA array. This         array will hold the elements of the UNSA array in sorted manner.     -   w. Step 321: Reset the value of LoopCounter to zero.     -   x. Step 322: Start loop to copy the string from UNSA array to         the SSTA: Check if LoopCounter is less than the UNSA array         length. If the result is true, step to 323. If false, go to step         327.     -   y. Step 323: Get the Int value from the record in the ARI array         at index equals to LoopCounter.     -   z. Step 324: Get the string from the UNSA array at index equals         to the Int value.     -   aa. Step 325: Set the SSTA array value at index equals to         LoopCounter to the string.     -   bb. Step 326: Increment the value of the LoopCounter by one,         then step to 322 (continue the loop).     -   cc. Summary of FIG. 3D steps from 327 to 331: Start sorting the         groups in the SSTA that have been noted in the EVARI array.     -   dd. Step 327: Reset the value of LoopCounter to zero.     -   ee. Step 328: Start loop to sort the equals, found in EVARI         records, as strings in the SSTA array using SAlg: check if         LoopCounter is less than the EVARI array length. If the result         is true, step to 329. If false, step to 332.     -   ff. Step 329: Get the start and end value ARI from the EVARI         array at index equals to LoopCounter.     -   gg. Step 330: Sort the SSTA array starting from index equals to         start value and ending at index equals to end value using the         same sort algorithm that used to sort the ARI array.     -   hh. Step 331: Increment the value of the LoopCounter by one,         then step to 328 (continue the loop).     -   ii. Step 332: Output the sorted array

FIGS. 4A and 4B show the graphical comparison of the speed factor for running the first methodology in sequential and parallel modes with different integer sizes (Int16, Int32, Int64, and the integer part of the Decimal) that would hold the converted numerical value of the string prefix. On the other hand, FIGS. 4C and 4D show the table holding the running time in seconds of the methodology for different size integers that hold the numerical value of the prefix.

FIG. 5: First method of table lookup is the linear search, 13 arrays of records are created such that each record holds two elements, the first holds a character (A to Z) the second holds the value for that character. In the first array, the characters values will be 1 to 27 multiplied by 27¹² while in the 13th array the values will be 1 to 27. Each character in the prefix is searched for using linear search to find the value for the character according to its location in the prefix from left to right. The first character from the left is searched for in the first table using linear search and its value is added to the value of the second character from the left after searching for that character in the second table using linear search. Again, these operations are done until we search the 13th character from the left from the 13th table using linear search and its value is added to the sum of the previous 12 characters of the prefix and assigned to an ulong integer. The resulting sum will be considered as the numerical value of the string prefix.

FIG. 6: The second method of table lookup uses hash table. Again, thirteen arrays are built and a hash function is created to map each character to an array element where the numerical value of the character resides. In the first array, the characters values will be 1 to 27 multiplied by 27¹² while in the 13th array the values will be 1 to 27. Each character in the prefix is searched for using hash search to find the value for the character according to its location in the prefix from left to right. The first character from the left is searched for in the first table using hash search and its value is added to the value of the second character from the left after searching for that character in the second table using hash search. Again, these operation are done until we search for the 13th character from the left from the 13th table using hash search, and its value is added to the sum of the previous 12 characters of the prefix and assigned to an ulong integer.

FIGS. 7A, 7B, and 7C: Another elegant method called KOT method of converting the characters in the string prefix to an integer value is described. Create thirteen arrays with size equal to the ASCII table. The 13th table will hold values for each alphabetical character at its ASCII location this will allow us to get these values using the characters binary value as index to these tables. In the 13th table, the characters will have values from 1 to 27. The 12th table will hold the same value from the 13th table, each multiplied by 27. Consequently, the first table will hold the same values in table 13th multiplied by 27¹². Converting the prefix string will be just adding the values from the tables according to the character and their corresponding location in the tables as shown in FIGS. 7A, 7B and 7C. The resulting sum will be the conversion for the string prefix to numerical value which will be assigned to an ulong.

FIG. 8A and FIG. 8B: The tables here show the computation of 13 character Substring (ACKNOWLEDGMEN) of the word (ACKNOWLEDGMENTS) then the computation is as follows: Value=1stCharTable[A]+2nd CharTable[C]+3rd CharTable[K]+4th CharTable[N]+5th CharTable[O]+6th CharTable[W]+7th CharTable[L]+8th CharTable[E]+9th CharTable[D]+10th CharTable[G]+11th CharTable[M]+12th CharTable[E]+13th CharTable[N]=108072162132297052.

FIGS. 9A and 9B show the graphical comparison for the speed factor gained for the sequential and parallel execution of the first methodology for alphabetic strings, using the three-table lookup methods, KOT, linear, and hash table search methods. The .Net Sort is SAlg used here, and one hundred million variable size string data elements. On the other hand, FIGS. 9C and 9D show the tables with the running time in seconds along with the speed factor gained for the sequential and parallel execution of the first methodology for alphabetic strings using the three-table lookup methods and SAlg is .Net Sort (QS).

FIGS. 10A and 10B show the speed factor gain by the first methodology in sequential mode for two string types: alphabetic and alphanumeric. Moreover, the test was made on four SAlgs with O(NlogN): quicksort, heapsort, merge sort, and .Net sort. Furthermore, the prefix string conversion was done using the KOT method. Finally, the number of elements were chosen to represent many possible inputs; from ten thousand to one hundred million. FIGS. 10C and 10D show the table with the actual execution times in seconds for all the algorithms shown in the graphs.

FIGS. 11A and 11B show the speed factor gain by the first methodology in parallel mode for two string types: alphabetic and alphanumeric. Moreover, the test was made on four SAlgs with O(N log N): quicksort, heapsort, merge sort, .Net sort and QIM sort. Furthermore, the prefix string conversion was done using the KOT method. Finally, the number of elements were chosen to represent many possible inputs; from ten thousand to one hundred million. FIGS. 11C and 11D show the table with the actual execution times in seconds for all the algorithms shown in the graphs.

FIGS. 12A and 12B show the speed factor gain by the first methodology on alphabetic string type only, in sequential and parallel modes. Moreover, the test was made on four SAlgs with O (N²): bubble, selection, and insertion sort. Furthermore, the prefix string conversion was done using the KOT method. Finally, the number of elements were chosen to represent many possible inputs; from one thousand to one million. FIGS. 12C and 12D show the table with the actual execution times in seconds for all the algorithms shown in the graphs.

FIG. 13: In this figure, the flowchart of the second methodology is summarized in seven steps.

-   -   a. Step 1301: The unsorted array is inputted to the second         methodology for processing.     -   b. Step 1302: Here, the first stage of the second methodology is         done. A prefix is extracted from each string of the inputted         unsorted array. Each string prefix is converted to a list         characters that are placed in an array of character records. The         conversion process has been fully discussed in this document.     -   c. Step 1303: This represents the second stage where the code of         the given algorithm is used to sort the array of character         records.     -   d. Step 1304: This is the third stage, when the sorting         algorithm ends, some character records in the array may have         same characters. A program would scan the array of character         records and register the first element and last element in every         group with the same characters in the records of the array         character records. These location values are saved in another         array of integer record. Details of these operations are         discussed in this document.     -   e. Step 1305: This is the fourth stage where the unsorted array         is sorted by copying its elements to another array using the         sorted array of character records as a reference. The result is         a sorted array with some parts having equal prefix values.     -   f. Step 1306: Using the input algorithm again to sort the         strings with equal prefixes found in stage 3 (step 1304). The         array of character records created in step 1304 (stage 3) is         used as a reference to sort the elements with equal value prefix         in the new sorted array. Details of these operations are         discussed in this document.     -   g. Step 1307: The sorted array is ready for output.

FIG. 14: This figure shows a simple example of the second methodology. In this example, the characters of the string prefix are taken and placed in a record of characters. The figure shows five tables. Each table represents one of the five stages of the methodology. A three-character prefix was chosen to simplify the operations. The characters chosen for the prefix have been underlined. Extract the string prefix (three characters) from the input string array and place the characters in a record of characters. The table for stage 2 shows the sorted array (ACHR) using a sort algorithm (SAlg) based on the character values in the record of characters. The objective here is to sort character list rather than sorting string elements. After sorting, table 3 shows stage 3 after copying elements in the UNSA to the SSTA based on the sorted results of the ACHR. Stage 4 is shown in table 4 where the list equal elements in SSTA are stored. Table 5 shows SSTA fully sorted as of stage five and after sorting the list of equals.

FIGS. 15A, 15B, 15C, and 15D present the flowcharts for the stages of the second methodology. The graph is made up of four sub-flowcharts each showing a stage or two of the first methodology. Each step in the sub-flowchart is numbered, and each numbered step are explained in the following text.

Summary of steps from 1501 to 1531: We want to sort the input string array. The process of sorting is divided into four sub-flowcharts. The first sub-flowchart represents stages one and two of the second methodology and its elements are numbered 1501 to 1508. The second sub-flowchart represents stage three and its elements are numbered 1509 to 1519. The third sub-flowchart represents stage four and its elements are numbered 1520 to 1526. The fourth sub-flowchart represents stage five and its elements are numbered 1527 to 1532.

Summary of steps from 1501 to 1508: extract the string prefix (1503 to 1513 characters) from the input string array and place the characters of the prefix in a character record of an array of records of characters (ACHR). Then, start the sort process on the characters in ACHR. After sorting the ACHR using a sort algorithm (SAlg) based on characters in record of characters control, go to the next sub-flowchart of third stage of the second methodology. The objective here is to sort character elements rather than sorting string elements. In the following paragraphs, each step of the first sub-flowchart is discussed in details.

-   -   a. Step 1501: Load the data to be sorted into string array,         called here unsorted string array (UNSA).     -   b. Step 1502: Create an array of character records (ACHR)         parallel to the UNSA array and equal in size. Each record in         ACHR has fields for character elements and 4 bytes integer         (Int). The fields will hold the characters of the string prefix         with each field holding exactly one character. The integer field         in the record will hold the corresponding index of the string in         the UNSA array.     -   c. Step 1503: Create an integer variable with the name         LoopCounter and assign it Zero as its initial value.     -   d. Step 1504: Start loop to convert each prefix to list of         characters. Check if LoopCounter less than or equals to the         length of the ACHR array. If the checking result is true,         proceed to step 1505. If not true, go to step 1508.     -   e. Step 1505: At index equals to LoopCounter, take a prefix from         the string in the UNSA array and convert it to its characters         elements.     -   f. Step 1506: Assign the characters extracted in step 1505 to         the fields of a record in the array of character records ACHR         array at index of LoopCounter and assign the value of the         LoopCounter to the integer in the ACHR record array.     -   g. Step 1507: Increment the value of the LoopCounter by one,         then go to step 1504 (continue the loop).     -   h. Step 1508: Start the sorting process using SAlg on the ACHR         array based on the characters that each record holds.     -   i. Summary of steps from 1509 to 1519: The sorted ACHR array         from 1501 to 1508 may include a number of records having the         same characters in their fields. We try to find the groups of         records that have the same characters and place their location         (beginning and end) in an array of integer records (EVCHR)     -   j. Step 1509: After sorting ACHR array, there might be lists of         records with the same characters in the sorted ACHR. For this         case, another record array, called equal values array (EVA),         with two integers to hold the index of start and end of each         list of records with the same characters in the ACHR after         sorting.     -   k. Step 1510: Reassign the LoopCounter the value one.     -   l. Step 1511: Start outer loop to look for records with same         characters in the ACHR array: Check if LoopCounter less than or         equals to the length of ACHR. If the result is true, proceed to         step 1512. If false, go to step 1520.     -   m. Step 1512: Here we look for lists of records with the same         characters. To check if two consecutive records of characters in         in the ACHR have the same characters as follows: check if the         characters in the record in the ACHR at index 4[LoopCounter-1]         equals the characters in the record in the ACHR at index         [LoopCounter]. If the result is true, step to 1514. If false, go         to step 1513.     -   n. Step 1513: Increment the value of the LoopCounter by one.     -   o. Step 1514: Create an integer variable with the name         InnerLoopCounter and assign the value of LoopCounter+1 to it.     -   p. Step 1515: Start inner loop find and record the start and end         of the records with the same characters. Check if         InnerLoopCounter is less than the ACHR array length. If the         result is true, step to 1516. If false, go to step 1511.     -   q. Step 1516: Check ACHR array if the characters record in the         record at index [LoopCounter] equals the characters in the         record at index [InnerLoopCounter]. If the result is true, go to         step to 1517. If false, go to step 1518.     -   r. Step 1517: Increment the value of the InnerLoopCounter by         one, then step to 1515 (continue the inner loop).     -   s. Step 1518: After finding the records with the same characters         in ACHR, the index of the start and end of these character         records are recorded in the current record of equal values array         (EVA). In this case, the start would be LoopCounter−1 as the         start and InnerLoopValue as the end.     -   t. Step 1519: Update LoopCounter value to equal InnerLoopCounter         value, then step to 1511 (continue the outer loop).     -   u. Summary of steps from 1520 to 1526: We copy the strings from         the input array UNSA, create an array (SSTA) and copy all the         string from the UNSA to SSTA according to the integer value in         the ACHR array. Here, we will have a semi sorted array with         groups of strings whose prefix values are sorted, but the         strings themselves are not sorted. The locations of these         unsorted strings are noted in the EVA array.     -   v. Step 1520: Create a new string array. We call it here sorted         string array (SSTA) with size equals to the UNSA array. This         array will hold the elements of the UNSA array in sorted manner.     -   w. Step 1521: Reset the value of LoopCounter to zero.     -   x. Step 1522: Start loop to copy the string from UNSA array to         the SSTA: Check if LoopCounter is less than the UNSA array         length. If the result is true, step to 1523. If false, go to         step 1527.     -   y. Step 1523: Get the Int value from the record in the ACHR         array at index equals to LoopCounter.     -   z. Step 1524: Get the string from the UNSA array at index equals         to the Int value.     -   aa. Step 1525: Set the SSTA array value at index equals to         LoopCounter to the string.     -   bb. Step 1526: Increment the value of the LoopCounter by one,         then step to 1522 (continue the loop).     -   cc. Summary of steps from 1527 to 1531: Start sorting the groups         in the SSTA that have been noted in the EVARI array     -   dd. Step 1527: Reset the value of LoopCounter to zero.     -   ee. Step 1528: Start loop to sort the equals found in EVARI         records as strings in the SSTA array using SAlg. Check if         LoopCounter is less than the EVARI array length. If the result         is true, step to 1529. If false, step to the End.     -   ff. Step 1529: Get the start and end value ARI from the EVARI         array at index equals to LoopCounter.     -   gg. Step 1530: Sort the SSTA array starting from index equals to         the start value and ending at index equals to the end value         using the same sort algorithm that used to sort the ACHR array.     -   hh. Step 1531: Increment the value of the LoopCounter by one,         then step to 1528 (continue the loop).     -   ii. Step 1532: Return sorted array.

FIGS. 16A and 16B show speed factor for the second methodology in sequential and parallel execution with character records having three to thirty characters to sort 100 million strings. The SAlg being .Net sort for the sequential execution and QIM under PDS for the parallel execution. On the other hand, FIGS. 16C and 16D show the tables with the running time in seconds of .Net algorithm for three or more characters records. Note that the speed factor is a comparison of the running time for .Net sort in sequential mode, which took 363 seconds to sort 100,000,000 elements, to the running time of the same .Net algorithm running within the second methodology.

FIGS. 17A and 17B show speed factor for sorting arrays with fixed size strings. For example, the fixed size alphanumeric string of six character used by airlines to represent passenger name record (PNR). PNR is used for flight booking, reservation, and checking in. The graph representing the speed factor for the execution of both the first and the second methodologies. The first methodology using: Int32, KOT, and .Net sort in sequential run and QIM under PDS in parallel run. The second methodology using character records with six characters while .Net sort in sequential run and QIM under PDS in parallel run.

FIGS. 18A and 18B show the speed factor gained for the sequential and parallel execution of the second methodology for alphabetic character strings, where SAlg is .Net, Merge, Quick and Heap Sort. On the other hand, FIGS. 18C 18D show the table with the running time in seconds of each algorithm under different load of elements to be sorted. The speed factor is computed in comparison to the corresponding SAlg running without the methodology. Here, the PDS methodology is used with QIM and Merge algorithm.

FIGS. 19A and 19B show the speed factor gained for the sequential and parallel execution of the second methodology for alphabetic character strings, where SAlg is Bubble, Selection and Insertion Sort. On the other hand, FIGS. 17C and 17D show the tables with the running time in seconds of each algorithm under different load of elements to be sorted. The speed factor is computed in comparison to the corresponding SAlg running without the methodology. Here, the PDS methodology is used with Bubble, Selection, and Insertion algorithms.

FIGS. 20A and 20B show a graphical comparison of the sequential and parallel running time of the five stages for both the first and the second methodologies. On the other hand, FIG. 20C show the tables of the actual running times in seconds.

FIG. 21 shows the flowchart of the Parallel Data Sort, PDS, the methodology that allows many sequential sorting algorithms to run in parallel. The PDS has the following steps:

-   -   a. Step 2101: Input the unsorted array L of length (l).     -   b. Step 2102: Insert the divider (d).     -   c. Step 2103: Divide (l) by (d) such that (l=d*q+remainder).     -   d. Step 2104: Check if remainder (r) equal Zero. If yes step to         2106. Else, step to 2105.     -   e. Step 2105: Remove r elements from array L and place it in sub         array (R), sort R using SAlg.     -   f. Step 2106: Divide the array L into (d) sub arrays with each         of size equals (q).     -   g. Step 2107: Stage 1, sort the (d) sub arrays in parallel using         SAlg for each process     -   h. Step 2108: Stage 2, merge every two sorted sub-array using         SAlg.     -   i. Step 2109: Are all the sub arrays became one array. If yes         step to 2110, else to 2108.     -   j. Step 2110: merge sort (R) with the just sorted array using         SAlg.     -   k. Step 2111: Output the sorted array L.

FIG. 22 shows the flowchart for Parallel Bubble sort merge execution in the second stage of PDS which we called bubble merge and it is made up of the following steps:

-   -   a. Step 2201: Input the first sorted array and call it (A).     -   b. Step 2202: Input the second sorted array and call it (B).     -   c. Step 2203: Define seven variables: first variable is an         integer call it (Aindex) and assign it the value of the length         of array A minus one. The second variable is an integer call it         (Bindex) and assign it the value Zero. The third (Aend) and         assign it the value Zero. The fourth (Bend) and assign it the         value of B array length minus one. The fifth variable is a         Boolean and call it (flag) and assign it the value ‘True’. The         sixth variable (Avalue) of the same type of A and B elements and         assign it the value of the A array element at index (Aindex).         The seventh variable (Bvalue) have the same type of A and B         elements and assign it the value of the A array element it index         (Aindex).     -   d. Step 2204: Outer loop start: Check if (Aindex) is greater or         equal to Zero and the flag is ‘true’. If the checking result is         yes, step to 2205. Otherwise, step to 2211.     -   e. Step 2205: Assign (Mindex) the value of (Aindex). And assign         the value ‘false’ to (flag).     -   f. Step 2206: Inner loop start: Check if (Mindex) less than the         length of array M minus one. If true, step to 2207. Otherwise,         step to 2210.     -   g. Step 2207: Check if the element of the array (M) at index         (Mindex) is greater than the element at index (Mindex+1). If the         result is true, step to 2208. Otherwise, step to 2210.     -   h. Step 2208: Swap the element at index (Mindex) with the         element at index (Mindex+1). Also, assign the value ‘True’ to         the variable (flag).     -   i. Step 2209: Increment (Mindex) by one, then step to 2207         (continue inner loop).     -   j. Step 2210: Decrement (Aindex) by one, then step to 2205         (continue outer loop).     -   k. Step 2211: Output the sorted M array.

FIG. 23 shows step by step example of the use of bubble sort algorithm in merging two sorted arrays in parallel into a one sorted array.

FIG. 24 shows the flowchart for Selection sort execution in the second stage of PDS which we called selection merge and it is made up of the following steps:

-   -   a. Step 2401: Input the first sorted array and call it (A).     -   b. Step 2402: Input the second sorted array and call it (B).     -   c. Step 2403: Create an array, call it (M) and copy the (A)         array first, then the (B) array.     -   d. Step 2404: Define four integer variables: Aindex, Mlength,         Mindex, and swapindex. Assign Aindex the length of array (A)         array minus one. Assign Mlength the length of array (M).         Moreover, define a variable (temp), and a Boolean variable         ‘flag’.     -   e. Step 2405: Outer loop start: Check if (Aindex) is greater or         equal to zero. If the checking result is true, step to 2406         Otherwise, step to 2416.     -   f. Step 2406: Assign (Mindex) the value of (Aindex +1). Second,         assign (flag) the value ‘False’.     -   g. Step 2407: Inner loop start: Check if (Mindex) is less than         Mlength. If the result is true, step to 2408. Otherwise, step to         2411.     -   h. Step 2408: Compare if the element of array (M) at index         (Aindex) is less than the element at index (Mindex). If the         result is true, step to 2411. Otherwise, step to 2409.     -   i. Step 2409: Assign swapindex the value of (Mindex). Also,         assign the value ‘True’ to the variable (flag).     -   j. Step 2410: Increment (Mindex) by one, then step to 2407         (continue inner loop).     -   k. Step 2411: Check if flag value is true. If the result is         true, step to 2412. Otherwise, step to 2416.     -   l. Step 2412: Assign temp the value of the (M) array at index         (Aindex).     -   m. Step 2413: Shift ((swapindex)−(Aindex)) elements in (M) array         starting from index equals to ((Aindex)−1) to the index equals         to (Aindex).     -   n. Step 2414: Assign the element in (M) array at index equals to         (swapIndex) the value of (temp).     -   o. Step 2415: Decrement (Aindex) by one, then step to 2405         (continue outer loop).     -   p. Step 2416: Output the sorted M array.

FIG. 25 shows step by step example of the use of selection sort algorithm in merging two sorted arrays into a one sorted array.

FIG. 26 shows the flowchart for Insertion sort execution in the second stage of PDS which we called insertion merge and it is made up of the following steps:

-   -   a. Step 2601: Input the first sorted array and call it (A).     -   b. Step 2602: Input the second sorted array and call it (B).     -   c. Step 2603: Create array call it (M) and copy the (A) array         first, then the (B) array.     -   d. Step 2604: Define five variables: the first call it (Aindex)         and assign it the value of (A) array length, the second call it         (flag) and assign it the value ‘True’, the third call it         (startIndex) and assign it the value Zero. The fourth call it         (Mindex), and the fifth call it (temp).     -   e. Step 2605: Outer loop start: Check if (Aindex) is less than         Zero. If the checking result is true, step to 2606. Otherwise,         step to 2615.     -   f. Step 2606: Assign (Mindex) the value (startIndex) and (temp)         the value of M[Aindex] and flag the value ‘False’.     -   g. Step 2607: Inner loop start: Check if (Mindex) less than         (Aindex). If the result is true, step to 2608. Otherwise, step         to 2611.     -   h. Step 2608: Check the variable temp if it is less than         M[Mindex] array element. If the result is true step to 2610.         Otherwise step to 2609.     -   i. Step 2609: Increment (Mindex) by one, then step to 2607         (continue inner loop). “Get the next element for comparison”.     -   j. Step 2610: Assign the value (Mindex) to the variable         (startIndex) and the value ‘True’ to the variable (flag).     -   k. Step 2611: Check if flag value is true. If true, step to         2612. Otherwise, step to 2616.     -   l. Step 2612: Shift a number of elements in array M equal         ((Aindex)−(startIndex)). The shift would be starting from         location of (Aindex) to location (Aindex+1).     -   m. Step 2613: Assign element of array M at location (Aindex) the         value (temp).     -   n. Step 2614: Increment (Aindex) by one, then step to 2605         (continue outer loop).     -   o. Step 2615: Output the sorted M array.

FIG. 27 shows step by step example of the use of insertion sort algorithm in merging two sorted arrays into a one sorted array.

FIG. 28 shows the flowchart for Merge sort execution in the second stage of PDS which we called Merge merge and it is made up of the following steps:

-   -   a. Step 2801: Input the first sorted array and call it (A).     -   b. Step 2802: Input the second sorted array and call it (B).     -   c. Step 2803: Create array call it (M) with size equal to A         length+B length.     -   d. Step 2804: Define five variables: the first call it (Aindex)         and assign it the value Zero, the second call it (Bindex) and         assign it the value Zero, and the third call it (Mcounter) and         assign it the value Zero. The fourth call it (Alength) and         assign it the A array length. The fifth call it (Blength) and         assign it the value B array length.     -   e. Step 2805: Loop start: Check if Aindex value is less than         Alength and Bindex value is less than Blength. If the result is         true, step to 2806. Otherwise, step to 2809.     -   f. Step 2806: Check if the A array element at (Aindex) is less         or equal to the B array element at (Bindex). If the result is         true, step to 2807. Otherwise, step to 2808.     -   g. Step 2807: Assign the M array element at index (Mcounter) the         value of A array element at (Aindex). Increment (Mcounter) and         (Aindex) by one. Then, step to 2805.     -   h. Step 2808: Assign the M array element at index (Mcounter) the         value of B array element at index (Bindex). Increment (Mcounter)         and (Bindex) by one. Then, step to 2805 (CONTINUE LOOP).     -   i. Step 2809: check if (Aindex) is greater or equal to Alength.         If the result is true, step to 2810. Otherwise, step to 2811.     -   j. Step 2810: Insert the remaining B array elements starting         from Bindex to M array starting from Mcounter position. Then,         step to 2812.     -   k. Step 2811: Insert the remaining A array elements starting         from Aindex to M array starting from Mcounter position.     -   l. Step 2812: Output the sorted M array.

FIG. 29 shows step by step example of the use of merge sort algorithm in merging two sorted arrays into a one sorted array.

FIG. 30 shows block merge, where merging is done block wise where a block of elements are move to array M rather than one string element at a time moved to array M:

-   -   a. Step 3001: Input the first sorted array and call it (A).     -   b. Step 3002: Input the second sorted array and call it (B).     -   c. Step 3003: Create array call it (M) with size equal to A         length+B length.     -   d. Step 3004: Define seven variables: the first call it (Aindex)         and assign it the value Zero, the second call it (Bindex) and         assign it the value Zero, and the third call it (Mcounter) and         assign it the value Zero. The fourth call it (Alength) and         assign it the A array length. The fifth call it (Blength) and         assign it the value B array length. The sixth call it (flag) and         set it to true. And the last one call it (i) and set it to zero.     -   e. Step 3005: Loop start: Check if Aindex value is less than         Alength and Bindex value is less than Blength and flage is true.         If the result is true, step to 3006. Otherwise, step to 3007.     -   f. Step 3006: set flag to false     -   g. Step 3007: Loop start: Check if (i) value is less than         Alength and. If the result is true, step to 3008. Otherwise,         step to 3011.     -   h. Step 3008: Check if B array element t index (Bindex) less         than A element at index (i). If the result is true, step to         3009. Otherwise, step to 3010.     -   i. Step 3009:     -   j. Set flag to true.     -   k. Copy (i-Aindex) elements from A starting from (Aindex) to M         array starting from (Mcounter).     -   l. Add (i-Aindex) to the current value of Mcounter.     -   m. Set the element in M at index (Mcounter) the value of the         element in B array at index (Bindex) then increment Mcounter by         one.     -   n. Incremenet (Bindex) by one.     -   o. Set (Aindex) the value of (i).     -   p. Step to 3005.     -   q. Step 3010: Increment (i) by one.     -   r. Step 3011: check if (Aindex) is greater or equal to Alength.         If the result is true, step to 3013. Otherwise, step to 3012.     -   s. Step 3012: Insert the remaining A array elements starting         from Aindex to M array starting from Mcounter position. Then,         step to 3014.     -   t. Step 3013: Insert the remaining B array elements starting         from Bindex to M array starting from Mcounter position.     -   u. Step 3014: Output the sorted M array.

FIG. 31 shows step by step example of the use of block merge sort algorithm in merging two sorted arrays into a one sorted array.

FIG. 32A is a graph showing the speed factor gained between parallel and sequential execution for QIM and merge sort under PDS using a processor with six-core processors and 12 threads. The speed gain for QIM was more than 3 times faster, while merge sort was more than two times faster than the sequential run, respectively. FIG. 32B is a table showing sequential and parallel execution times in seconds for sorting using QIM and merge.

FIGS. 33 A, B, and C show the graph for the speed factor gain by using PDS with merge for O(N²) algorithms: insertion, bubble and selection sorts.

FIG. 33D shows the table for sequential execution time and PDS time in seconds for sorting using bubble, selection and insertion.

FIG. 34A shows the speed factor gained when using the PDS methodology with block merge on insertion and bubble sorts.

FIG. 34B shows the speed factor gained of the parallel first methodology using the PDS methodology with block merge on bubble and insertion sorts.

FIG. 34C Execution time for sequential bubble and insertion sort along with parallel bubble and insertion sort using PDS with block merge methodology.

FIG. 34D Execution time for sequential bubble and insertion sort along with parallel bubble and insertion sort using the first methodology and PDS with block merge.

INDUSTRIAL APPLICATION

Three methodologies were presented in this embodiment for enhancing the speed performance of data sorting algorithms in the sequential and parallel mode. Although all the tested algorithms had a speed gain, the speed gain varied from one algorithm to another. Moreover, numerical prefix conversion gave higher performance values over the character record method. However, the record of character methods would work better for multilingual data set.

An important key to algorithm design is to use sorting as a basic building block because once a set of items is sorted, many issues become easy to resolve. The following applications can be considered:

-   -   Commercial computing. Governments, financial institutions, and         commercial enterprises (such as airlines) organize much of their         information by sorting it. Whether the information are accounts         to be sorted by name, transactions to be sorted by time or         place, mail addresses to be sorted by cities, files to be sorted         by name or date, etc. Processing such data certainly involves         the use of a sorting algorithm.     -   Search for information. Keeping data in a sorted order makes it         easy to efficiently search through them using the classic binary         search algorithm.     -   Recognition of repetition. When there is a duplication in the         data (for example, people having the same name but different         social security numbers), a sorting algorithm will be able to         identify such duplication.     -   Frequency distribution. Given a set of n items, which element         occurs the largest number of times in the set? If the items are         sorted, we can sweep from left to right and count them since all         identical items will be lumped together during sorting. 

What is claimed is:
 1. A method of sorting data and perform a search on sorted data using a computer, comprising: gathering data in the form of a unsorted string array from an institution that needs to be converted in the form of the sorted data to perform a search in a processor of the computer; extracting a string prefix from each of the unsorted string array in a central processing unit or multiple processing units locally or remotely residing in the computer; converting the string prefix of the unsorted string array to an unsigned long integer value and storing in an array with record of integers (ARI); wherein each record of integers holds two integers, one for storing a prefix value and the other holds the location of the string in the unsorted string array where the string prefix was extracted wherein the unsigned long integers are calculated in bytes; sorting the ARI, using a SAlg sorting algorithm (SAlg), wherein the sorting is done on the integer of the prefix value; Sorting the unsorted string array by transferring its string elements to a sorted string array (SSTA), using a location integer in the sorted ARI as a reference; finishing by sorting a list of equals on the SSTA as integers as strings if they exist in the ARI; and improving a speedup factor gain for sorting; wherein converting a string of length N to an integer value, base 10, is done as follows: Building a L tables, L=13 for alphabetic characters and L=12 for alphanumeric characters, wherein these tables will be searched, looked up, using one of three search methods for table lookup: hash search, linear search or KOT search, wherein the first table will represent the rightmost element of the string, while table L^(th) will hold the values for left most elements in the string; Searching using a hash search and a linear search, each table has two columns each of length equal to the number of the alphabets in the language, for English language the table length is 27, which is base(B) 27, for alphanumeric B=37 or up to 40; Wherein the first column in each table holds the alphabet, but the first element is a padding character (@), a second element is A, and a last element in this column is a Z character; Wherein a second column of each of these tables holds the value of a character (CHV) depending on the character location in the string which or table number and is equal to: CHV×B^(L-1) or CHV×27^(L-1), wherein a character values, are as follows: the extra character is the padding character with value 1, while A will get the value 2 and Z will have the value 27; Wherein for a KOT search, there will be L tables with one column whose length equal to the ASCII table, wherein all elements in the table are set to zero except those whose index is equal the ASCII value of the alphabet used in the string to be searched; wherein at the location equal to the ASCII value of A in all the tables will be 2×27^(L-1), depending on the table number; Wherein the conversion process starts with a CPU accumulator initialized to zero, removing the right most character from a string of length L and search in the first table using one of the search lookup methods to obtain a value and add the value to the accumulator, removing the next character and continue this process until all the string of length L characters have been searched and their values are added to the accumulator; and searching the sorted string array using a binary search algorithm for the institution to access their data more efficiently and fast.
 2. The method of claim 1, wherein the execution performance depends on the prefix size and corresponding choice of the integer size chosen to hold a converted prefix value.
 3. The method of claim 1, wherein the execution performance depends on the choice of a prefix characters conversion process; wherein there are three conversion processes of the prefix characters to integer values: linear search, hash table search, and KOT search.
 4. The method of claim 3, wherein the conversion processes uses tables that hold calculated values of each character that might appear in the prefix and depending on its location in the prefix; wherein after finding each character value in the prefix then they are summed together to give the prefix numerical value. 